// package com.hoshiicloud.common.aop;
//
// import com.hoshiicloud.common.exception.ServiceException;
// import java.lang.reflect.Method;
// import java.lang.reflect.Modifier;
// import java.util.HashMap;
// import java.util.Map;
// import javassist.ClassClassPath;
// import javassist.ClassPool;
// import javassist.CtClass;
// import javassist.CtMethod;
// import javassist.bytecode.CodeAttribute;
// import javassist.bytecode.LocalVariableAttribute;
// import javassist.bytecode.MethodInfo;
// import javax.servlet.http.HttpServletRequest;
// import lombok.extern.slf4j.Slf4j;
// import org.aspectj.lang.JoinPoint;
// import org.aspectj.lang.annotation.AfterReturning;
// import org.aspectj.lang.annotation.AfterThrowing;
// import org.aspectj.lang.reflect.MethodSignature;
// import org.springframework.web.context.request.RequestAttributes;
// import org.springframework.web.context.request.RequestContextHolder;
//
// /**
//  * @author markerccc
//  * @date 2019-09-24 - 13:43
//  */
// @Slf4j
// public class DataAccessAspect {
//
//     /**
//      * 成功返回执行操作
//      *
//      * @param joinPoint JoinPoint
//      */
//     @AfterReturning(value = "@annotation(DataAccess)")
//     public void success(JoinPoint joinPoint) {
//         process(joinPoint);
//     }
//
//
//     /**
//      * 异常返回执行操作
//      *
//      * @param joinPoint joinPoint
//      * @param error     error
//      */
//     @AfterThrowing(value = "@annotation(DataAccess)", throwing = "error")
//     public void error(JoinPoint joinPoint, Throwable error) {
//         process(joinPoint);
//     }
//
//     /**
//      * <p>
//      *
//      * @param joinPoint
//      * @Title: process
//      * </p>
//      * <p>
//      * @Description: 操作流程
//      * </p>
//      */
//     private void process(JoinPoint joinPoint) {
//         MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
//         Method method = methodSignature.getMethod();
//         // 获取注解对象
//         DataAccess dataAccessAnnotation = method.getAnnotation(DataAccess.class);
//         // 获取权限名称
//         String typeId = dataAccessAnnotation.typeId();
//         String parentId = dataAccessAnnotation.parentId();
//
//         RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
//         //从获取RequestAttributes中获取HttpServletRequest的信息
//         HttpServletRequest request = (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST);
//         // TODO 使用类拿到参数
//         Object target = joinPoint.getTarget();
//         String className = target.getClass().getName();
//         try {
//             Class<?> clazz = Class.forName(className);
//             //获取方法名称
//             String methodName = joinPoint.getSignature().getName();
//             String[] strings = methodSignature.getParameterNames();
//         } catch (ClassNotFoundException e) {
//             log.info("{}", e.getMessage());
//             throw new ServiceException("查询失败, 类型转换失败");
//         }
//     }
//
//     /**
//      * @return Map<String, Object>
//      * @Description 获取字段名和字段值
//      * @Author 刘俊重
//      * @date 2017年7月6日 
//      */
//     private Map<String, Object> getFieldsName(Class cls, String clazzName, String methodName, Object[] args) throws Exception {   
//         Map<String, Object> map = new HashMap<String, Object>();
//
//         ClassPool pool = ClassPool.getDefault();
//         ClassClassPath classPath = new ClassClassPath(cls);
//         pool.insertClassPath(classPath);
//
//         CtClass cc = pool.get(clazzName);
//         CtMethod cm = cc.getDeclaredMethod(methodName);
//         MethodInfo methodInfo = cm.getMethodInfo();
//         CodeAttribute codeAttribute = methodInfo.getCodeAttribute();
//         LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);
//         if (attr == null) {
//             // exception
//         }
//         int pos = Modifier.isStatic(cm.getModifiers()) ? 0 : 1;
//         for (int i = 0; i < cm.getParameterTypes().length; i++) {
//             //paramNames即参数名
//             map.put(attr.variableName(i + pos), args[i]);
//         }
//         return map;
//     }
// }
